
namespace FastFood.Business.Logic
{
	using System;
	using System.Collections.Generic;
	using EDOSwit.Entity;
	using FastFood.Business.Entities;
	using FastFood.DataAccess;
    using System.Data.Linq;
    using System.Linq;

	/// <summary>
	/// Represents the Manager of Compras.
	/// </summary>
	[Serializable]
	public class ComprasManager : Singleton<ComprasManager>
	{
        #region Methods

        /// <summary>
        /// Selects all records from the Compras table.
        /// </summary>
        public IList<Compras> ListarByEstado(string estado)
        {
            try
            {
                return ComprasData.Instancia.ListarByEstado(estado.Substring(0, 1)).Reverse().ToList();
            }
            catch (Exception) { throw; }
        }

		/// <summary>
		/// Selects all records from the Compras table.
		/// </summary>
		public IList<Compras> Listar()
		{
			try
			{
                return ComprasData.Instancia.Listar().Reverse().ToList();
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Selects a single record from the Compras table.
		/// </summary>
		public Compras Obtener(int compraID)
		{
			try
			{
				Compras compra = ComprasData.Instancia.Obtener(compraID);
                compra.DetallesCompras = new EntitySet<DetallesCompras>();
                compra.DetallesCompras.AddRange(DetallesComprasData.Instancia.ListarPorCompraID(compraID));
                foreach (DetallesCompras detalle in compra.DetallesCompras)
                {
                    detalle.Lotes = LotesData.Instancia.Obtener(detalle.loteID);
                    detalle.Lotes.Insumos = InsumosData.Instancia.Obtener(detalle.Lotes.insumoID);
                    detalle.DetCompraAlmacenamiento = new EntitySet<DetCompraAlmacenamiento>();
                    detalle.DetCompraAlmacenamiento.AddRange(DetCompraAlmacenamientoData.Instancia.ListarPorCompraIDLoteID(compraID, detalle.loteID));

                    foreach (DetCompraAlmacenamiento item in detalle.DetCompraAlmacenamiento)
                    {
                        item.Almacenes = AlmacenesData.Instancia.Obtener(item.almacenID);
                    }
                }
                return compra;
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Selects all records from the Compras table by a foreign key.
		/// </summary>
		public IList<Compras> ListarPorProveedorID(short proveedorID)
		{
			try
			{
                return ComprasData.Instancia.ListarPorProveedorID(proveedorID).Reverse().ToList();
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Saves a record to the Compras table.
		/// </summary>
		public int Agregar(Compras compras)
        {
			try
			{
                compras.estado = 'R';
				return ComprasData.Instancia.Agregar(compras);
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Updates a record in the Compras table.
		/// </summary>
        public bool Modificar(Compras compras)
        {
            try
            {
                compras.estado = 'E';
                Compras compraAntigua = Obtener(compras.compraID);
                foreach (DetallesCompras detalle in compras.DetallesCompras)
                {
                    detalle.Lotes.Insumos = InsumosData.Instancia.Obtener(detalle.Lotes.insumoID);
                }
                return ComprasData.Instancia.Modificar(compras, compraAntigua);
            }
            catch (Exception) { throw; }
        }

		/// <summary>
		/// Deletes a record from the Compras table by its primary key.
		/// </summary>
		public bool Eliminar(Compras compra)
		{
			try
			{
                return ComprasData.Instancia.Eliminar(compra);
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Deletes a record from the Compras table by a foreign key.
		/// </summary>
		public void EliminarPorProveedorID(short proveedorID)
		{
			try
			{
				ComprasData.Instancia.EliminarPorProveedorID(proveedorID);
			}
			catch (Exception) { throw; }
		}

        public bool ExisteDocumento(Compras compra)
        {
            return (ComprasData.Instancia.ObtenerPorDocumento(compra) != null);
        }

        #endregion
    }
}
